{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "from matplotlib import pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = np.linspace(-10,10,num=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "#x**4 - 3*x**3 + 2\n",
    "y = np.log(np.power(x,4) + np.power(x,3) + 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x128e44470>]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGfCAYAAABC5ObhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3Xdc1WX/P/DXdQ57742CCiogoOBeDXObVppWNizb++6uu/G9uxt3d+Pubg9TK8s0zdLcpmVuRUEREVCUKRtBpozDuX5/SP2sHEflcJ3xej4ePkI40uvj4cDL6/p83h8hpQQRERERXZhGdQAiIiIic8DSRERERGQAliYiIiIiA7A0ERERERmApYmIiIjIACxNRERERAZgaSIiIiIyAEsTERERkQFYmoiIiIgMYGOMT+rj4yPDwsKM8amJiIiIOlRKSkqllNL3Yo8zSmkKCwtDcnKyMT41ERERUYcSQuQb8jhuzxEREREZgKWJiIiIyAAsTUREREQGYGkiIiIiMgBLExEREZEBWJqIiIiIDMDSRERERGQAliYiIiIiA7A0ERERERmApYmIiIjIACxNRERERAZgaSIiIiIyAEsTERERkQFYmoiIiIgMwNJEREREJqdZ14bUwlOqY/wBSxMRERGZlN3HT2Lc+9sxc34STjW2qI7zOxvVAYiIiIgA4GR9M15bl4nl+4sQ6uWIj27tCw8nO9WxfsfSRERERErp9RLLUgrx+vosNDTr8PDV3fHI1RFwtNOqjvYHLE1ERESkzLHyejy/4hD25lZhQJgXXrshBhH+rqpjnRNLExEREXW6Zl0b5mzJwce/HoOjnRZv3tQH0xJCodEI1dHOi6WJiIiIOtW+vCo8t/wQjpXXY1JcEF6cGAVfV3vVsS6KpYmIiIg6RV1TK95Yn4VFSQUI9nDEl3f1x9W9/FTHMphZlqYjpXUI9HCAm4Ot6ihERERkgF8yy/DCinSU1zXh7qHheGp0JJztzauGmFdaAG16iQe+ScHplja8dkMMru3trzoSERERncfJ+ma8vDoDqw4WI9LfBZ/OHIK+XTxVx7osZjfcUqsReG96PNwdbXHPV8l4YskBVDeYzuArIiIiAqSUWJlahFHvbMX69BI8OSoSax4dbraFCTDDlSYAiAv1wOpHh+HjX4/h41+PYcexSrx8fQzG9wmAEKZ71j0REZE1KKttwgsrDuHnzHLEh3rgramxiDTRMQKXQkgpO/yTJiYmyuTk5A7/vOeSWVKLZ75Pw6GiGoyNDsCrU2LM4gx8IiIiSyOlxA/7i/DK6sNo1unx9JiemDU0HFoTHiMAAEKIFCll4kUfZ+6lCQB0bXrM256Ld38+Cmc7LV6ZHIOJsYFcdSIiIuokJTWn8dzyQ9hypAL9wzzx5k2x6ObrojqWQayqNP3mWHkdnlqWhoOFpzA2OgD/viEGPi5cdSIiIjIWKSWWpZzAq6szoNNL/GNsT9wxOMykh1T+mVWWJuCsVadNR+Fsr8WrU2IwMTZISRYiIiJLVl7bhOeWH8IvWeUYGO6F/06NQxdvJ9WxLpnVlqbfZJfV4e/LDuLgiRpMjA3Eq5Nj4OlsOndKJiIiMldSSqw6WIwXVx5Gs64Nz4zphbuGmNfq0tkMLU1mefWcISL8XfHDg0MwZ+txvP9LNpJyq/DmTX1wTS/OdSIiIrpcJ+ub8cKKdGw4XIq+XTzwv2lxZnPu0pUyuzlNl8JGq8Ej10Tgx4eHwtvZDncvSMYz3x9EXVOr6mhERERmZ1NGGca8tw2bs8rx7Lhe+P6BIVZTmAALXmk6W3SQO1Y+MhTv/5yNOVuPY+exk/jfzXEY1M1bdTQiIiKTV9fUilfXZOC75BPoHeiGRbPj0TPA/OcuXSqLXmk6m72NFs+M7YVlDwyBrVbglnl78Pq6TDTr2lRHIyIiMllJOScx7v3t+D7lBB66qjtWPjzUKgsTYEWl6TcJXT2x9rHhmNG/Cz7bloMpH+/CkdI61bGIiIhMSotOjzfWZ2HGvD3QagSWPTAYz4ztBTsbq6sOv7PKI3e2t8HrN/bB53cmoqKuCZM+2oH523Og13f8lYRERETm5lh5HaZ8vBNzth7HjP6hWPfYcCR09VIdSzmrLE2/uba3PzY8MQIjInzx77WZuPPLvSirbVIdi4iISAkpJb7enYcJH+xASc1pzL09Aa/fGAtne6s4BfqirLo0AYCPiz3m3ZGA12/sg+S8aox9bxs2Hi5VHYuIiKhTVdQ14+4F+/DiysMY1M0bPz0xAqOjA1THMilWX5oAQAiBWwZ0wZrHhiHY0xH3LUzB8ysO4XQLTxInIiLLt+VIOca9vw07j5/ES5OisGBWf/i5OaiOZXJYms7S3dcFyx8civtHdsO3ewsw8cPtOFxcozoWERGRUTTr2vDqmgzc9eU+eDvbY/Ujw3DX0HDe8P48WJr+xM5Gg+fG9caiewaivlmHGz7ehS935sIYt5shIiJS5XhFPW78ZBc+35GLOwZ3xcpHrHeUgKFYms5jSA8frH98BIZH+ODl1Rm49+tkVDW0qI5FRER0RaSU+C65EBM/2IHiU6cx745EvDI5Bg62WtXRTB5L0wV4Odth/p2J+NekKGw7Wolx72/D7uMnVcciIiK6LPXNOjyxNBXPfJ+G+FAPrH98BK6L4j1ZDcXSdBFCCMwaGo7lDw2Bs50Nbp2/B+9uOoo2znQiIiIzkl5Ug4kfbMfqg8X423WR+Gb2QAS482TvS8HSZKCYYHesfnQYbugbjPd/ycbM+Ukor+NMJyIiMm1SSizYmYsbP9mFplY9vr13EB67NgJaDU/2vlQsTZfA2d4G79wcj/9OjcWBwmqMf387dmRXqo5FRER0TjWnW/HANyl4aXUGhkX4YN3jwzGQN6u/bCxNl2FaYihWPTIMnk52uP2LJLzD7ToiIjIxh07UYOKH2/FLZjleGN8bn9+ZCC9nO9WxzBpL02WK9HfFykeGYmq/EHzQvl1XUdesOhYREVk5KSUW7snHTZ/ugq5NYun9g3HviG6cvdQBWJqugJOdDf47LQ5vT4vDgcJqTPhgO/bmVqmORUREVqq+WYfHlqTinz+mY0gPb6x9bDgSunqqjmUxWJo6wNSEEKx4aCic7W1wy7w9mLvtOIdhEhFRp8ouq8P1H+3A2rRiPD2mJ764sz+34zoYS1MH6R3ohlWPDMWYaH/8Z10W7l+YgprTrapjERGRFVh1sBiTP96J2tM6LJo9CA9f3QMaXh3X4ViaOpCrgy0+vrUf/jkxCpuzynH9RzuQVVqrOhYREVmoFp0eL606jMe+PYCoQDesfWwYBnfn1XHGwtLUwYQQuGdYOJbePwinW9pww8e7sDK1SHUsIiKyMCU1pzFj7m4s2JWHu4eG49v7BsHfjcMqjYmlyUgSunphzWPD0CfYHY8vScXLqw+jtU2vOhYREVmApJyTmPThDmSV1uGjW/vixUlRsNXyR7qx8W/YiPxcHbDo3oGYNTQMX+7Mw23zOEWciIgu32/TvW+bnwQ3B1usfHgoJsYGqY5lNViajMxWq8G/JkXj/RnxOFRUg0kf7sCBgmrVsYiIyMw0tbbhqWUH8dLqDFzV0xc/PjIUEf6uqmNZFZamTjI5PhjLHxoCOxsNpn+2B98lF6qOREREZuJEdSOmztmF5fuL8OSoSMy9PRFuDraqY1kdlqZO1DvQDaseHob+4Z545vs0vLSK5zkREdGF7ck5ies/2on8ykbMvyMRj4+K4DgBRViaOpmnsx2+mjUA9w4Px4JdeZg5Pwkn63n7FSIi+quFe/Ixc34SPJxs8eMjQzEqyl91JKvG0qSAjVaDFyZE4d3pcUgtPIXrP9qJjGLOcyIiojNadHo8v+IQ/vljOoZH+ODHh4eiu6+L6lhWj6VJoRv6huD7B4agTS8xdc4ubEgvVR2JiIgUO1nfjJnzk7A4qQAPjOyO+Xf25/lLJoKlSbE+Ie5Y9chQRPq74oFvUvDR5mzet46IyEplltTi+o924uCJU3h/RjyeHdcLWp6/ZDJYmkyAn5sDltw3CFPig/D2xqN4bEkqmlrbVMciIqJO9HNGGaZ+ugs6vR7LHhiMyfHBqiPRnxhUmoQQTwohDgsh0oUQ3wohOKe9gznYavHu9Hg8M7Yn1qQV4+bPdqOsloMwiYgsnZQS87bl4N6Fyejm64KVDw9DbIiH6lh0DhctTUKIYACPAUiUUsYA0AKYYexg1kgIgYeu6oG5tyfiWHk9pnzME8SJiCxZi06Pf/yQhtfWZWJcTAC+u38wAty5LmGqDN2eswHgKISwAeAEoNh4kei6KH8se2AwpASmzdmFzVllqiMREVEHq25owe2fJ+G75BN49Joe+OiWfnC006qORRdw0dIkpSwC8DaAAgAlAGqklBuNHczaRQe5Y+UjQxHu64zZXyXjy525PEGciMhC5FU24MZPd+FAwSm8Nz0eT43uyYGVZsCQ7TlPAJMBhAMIAuAshJh5jsfdJ4RIFkIkV1RUdHxSK+Tv5oDv7h+MUb398fLqDLy48jB0nCBORGTWkvOqcMMnO3GqsQWL7x2IKX15wre5MGR7bhSAXCllhZSyFcByAEP+/CAp5VwpZaKUMtHX17ejc1otJzsbzJmZgPtHdMPCPfm4b2EKGpp1qmMREdFlWH2wGLfOT4KHkx1WPDQUiWFeqiPRJTCkNBUAGCSEcBJCCADXAsg0biw6m0Yj8Nz43vj3lBhsOVKOGXP3oLyOV9YREZkLKSU+/vUYHv32AOJDPLD8wSEI83FWHYsukSHnNCUB+B7AfgCH2v/MXCPnonOYOagr5t1x5sq6Gz7ehWPldaojERHRReja9Hh+RTr++9MRTI4PwsLZA+DpbKc6Fl0GYYyTixMTE2VycnKHf146I+3EKdy9IBktujbMvSMRg7p5q45ERETn0Niiw6OLD+CXrHI8fHV3/H10T5zZtCFTIoRIkVImXuxxnAhuhmJDPLDioSHwdbXHHZ/vxeqDnABBRGRqKuubccu8JPx6pBz/nhKDp8f0YmEycyxNZirUywnLHxyK+FAPPPrtAXyxI1d1JCIiapdX2YCbPt2FI6W1mDMzATMHdVUdiToAS5MZc3eyxdf3DMCYaH+8siYDr6/P5CwnIiLFDhaewk2f7kLt6VYsmj0Io6MDVEeiDsLSZOYcbLX45LYEzBzUBZ9tzcFTyw6ilbOciIiU2Ha0ArfM2wNHOy1+eHAIErp6qo5EHchGdQC6clqNwKuTY+Dv6oD/bTqKyvoWfHpbPzjb8+klIuosK1OL8PdlB9Hd1wVf3z0Afm68h5yl4UqThRBC4NFrI/DGjX2wI7sCt81PQnVDi+pYRERWYcHOXDyxNBV9u3hi6f2DWZgsFEuThZkxoAvmzExARkktbv5sN0prOASTiMhYpJT438YjeGl1Bkb19sfXdw+Au6Ot6lhkJCxNFmh0dAAWzOqPkpom3PTpLuRWNqiORERkcdr0Ev/3Yzo+3HwMNyeG4NPb+sHBVqs6FhkRS5OFGtLdB9/eOwinW9swbc4uHC6uUR2JiMhitLbp8bfvUrEoqQAPjOyON2+KhY2WP1ItHZ9hC9YnxB3f3T8YdloNZny2B/vyqlRHIiIye02tbXhgYQpWphbjmbE98ew4Dq20FixNFq6HnwuWPTgEvm72uP3zJGzPrlAdiYjIbNU36zDry33YfKQcr06JwUNX9VAdiToRS5MVCPZwxNL7BiPM2xn3LEjGpowy1ZGIiMzOqcYW3DY/CXvzqvDOzXG4nVO+rQ5Lk5XwdbXHkvsGoXegKx74JgWreL86IiKDVdY3Y8bcPcgsrsWnt/XDDX1DVEciBViarIiHkx2+mT0QCV088fiSA/huX6HqSEREJq+stgnTP9uNvJMN+OKu/rwtihVjabIyrg62+OruARjWwwfP/JCGr3fnqY5ERGSyik+dxvT2mXdfzRqAYRE+qiORQixNVsjRTov5dyZiVG9/vLjyMD7fkas6EhGRySmsasTNn+3GyYYWLJw9EAO7eauORIqxNFkpexstPrmtH8ZGB+DVNRmYty1HdSQiIpORW9mAmz/bjbomHRbPHoR+XXjjXWJpsmp2Nhp8eGtfTOgTiNfWZeLTLcdVRyIiUu54RT2mf7YbLTo9vr13EPqEuKuORCbCRnUAUstWq8H7M+Kh0Qi8uSELbXo9HrkmQnUsIiIljlfU45a5e6CXEt/eNwiR/q6qI5EJYWki2Gg1ePfmONhoBN7eeBQ6vcQToyJVxyIi6lRnF6bF97Iw0V+xNBGAM8Xp7Wlx0AiB937Oho1GcMWJiKwGCxMZgqWJfqfVCLw1NRZ6KfH2xqPQajR48KruqmMRERkVCxMZiqWJ/kCrEXh7Whza9BJvbsiCrVZg9vBuqmMRERlFXmUDCxMZjKWJ/kKrEXjn5jPF6d9rM6HVCMwaGq46FhFRhyqsasSt8/ZAp5dYwpO+yQAsTXRONloN3psRD51ej5dXZ8BGI3D74DDVsYiIOkRJzWncOn8P6pt1vEqODMY5TXRetloNPrylH0b19sc/Vx7Gd8m8Vx0Rmb/yuibcNi8J1Q2tWHjPQEQHcQ4TGYaliS7IzkaDj2/ri+ERPnj2hzSsSStWHYmI6LJVNbRg5vwklNY2YcGs/ogL9VAdicwISxNdlL2NFnNvT0RCV088sSQVv2SWqY5ERHTJak63Yub8JOSfbMT8OxORGOalOhKZGZYmMoijnRaf39UfUUFueHDRfuw8Vqk6EhGRwRpbdLh7wT5kl9fhs9sTMKS7j+pIZIZYmshgbg62+GrWAIR7O+Per5ORkl+lOhIR0UU169pw/8IUHCioxgcz+uKqnn6qI5GZYmmiS+LpbIeFswfAz9Ued325DxnFtaojERGdV5te4smlqdieXYk3bozFuD6BqiORGWNpokvm5+qAb2YPhLOdDe74Yi/yTzaojkRE9BdSSjy//BDWHSrFPydG4eb+oaojkZljaaLLEuLphIX3DIBOr8ftn+9FeW2T6khERL+TUuI/6zKxNLkQj10bgXuGcUAvXTmWJrpsEf6u+PKu/qisb8YdX+xFzelW1ZGIiAAAn249jnnbc3HXkDA8OYo3H6eOwdJEV6RvF0/MmZmA4xX1mP3VPpxuaVMdiYis3LLkQry14QimxAfhxYlREEKojkQWgqWJrtiISF+8c3M8kvOr8cji/Wht06uORERWanNWGZ5dfgjDI3zw1tQ4aDQsTNRxWJqoQ0yKC8Ir10fjl6xy/N+KdEgpVUciIiuTkl+NhxbtR1SgGz6dmQA7G/6Io47FG/ZSh7l9cBjKapvx0a/HEOjhgCdGRaqORERW4lh5He75ah8C3Bzw5az+cLHnjzfqePyqog711OhIlNQ04b2fsxHo7oDp/buojkREFq60pgl3frEPNhoNvr57IHxc7FVHIgvF0kQdSgiBN27qg/K6Jjy/Ih1+rg64uhen7xKRcdQ1tWLWgn041diCpfcPRhdvJ9WRyIJxw5c6nK1Wg09nJqBXgCseWrQfaSdOqY5ERBaotU2PhxcfwNGyOnwyMwExwe6qI5GFY2kio3Cxt8GXs/rD28UOdy/Yh4KTjaojEZEFkVLinz+mY9vRCvznhhiMjPRVHYmsAEsTGY2fqwO+unsAWtskZi3g8Esi6jifbDmOJfsK8cjVPXjuJHUaliYyqu6+Lvjs9gQUVDXioUUpnOFERFdsZWoR/vvTmeGVT43mVbrUeViayOgGdfPGGzfGYuexk5zhRERXJCnnJJ5eloZB3bzw5tRYTvumTsWr56hT3JQQgryTDfhw8zGE+zrjgZHdVUciIjOTV9mA+79JQaiXIz6bmQh7G63qSGRlWJqo0zw5KhK5lQ14Y30Wuno5YVyfQNWRiMhM1JxuxT1f7YMA8MVd/eHuZKs6Elkhbs9Rp9FoBN6eFod+XTzwxNJUpBZyFAERXZyuTY9HFu9HQVUj5sxMQFdvZ9WRyEqxNFGncrDVYt4difB1tcd9XyejrLZJdSQiMnGvrMnA9uxKvDalDwZ281Ydh6wYSxN1Om8Xe8y/MxH1zTrc93UymlrbVEciIhP19e48fL07H/eN6Iab+4eqjkNWjqWJlOgV4IZ3p8fj4IkaPPtDGq+oI6K/2Ha0Ai+vzsCo3v74x9hequMQsTSROmOiA/D30ZH4MbUYc7bmqI5DRCYkr7IBjyzejwg/F7w3Ix5aDUcLkHosTaTUw1f3wMTYQLz1UxZ+zihTHYeITEB9sw73fp0MjUZg3h2JcLHnhd5kGliaSCkhBP47NQ4xQe54fMmZG28SkfXS6yX+tjQVOZUN+PjWfgj1clIdieh3LE2knKOdFnPvSICTvQ3uX5jCe9QRWbEPNx/DxowyPD++N4b28FEdh+gPWJrIJAS6O+KT2/qhsKoRT32XCr2eJ4YTWZuNh0vx7s9HcWPfYNw9NEx1HKK/YGkik9E/zAv/nBiFnzPL8eHmY6rjEFEnyi6rw5NLUxEb4o7/3NiH95Qjk8TSRCbljsFdcWPfYLz3y1FszuKJ4UTWoK6pFfcvTIGjnRZzZibAwZb3lCPTxNJEJkUIgddu6IPeAW54Ykkq8iobVEciIiOSUuLpZWnIr2rER7f2Q5CHo+pIROfF0kQmx9FOi89uT4BGI/DANylobNGpjkRERjJvew42HC7Fs2N7YRBvkUImjqWJTFKolxM+mNEXR8rq8NzyQ5wYTmSB9uScxJsbjmBcTABmDw9XHYfooliayGSNiPTFU9dFYmVqMRbvLVAdh4g6UFltEx5ZfABdvZzw1tRYnvhNZoGliUzaQ1f1wMhIX7y8KgPpRTWq4xBRB2ht0+ORxfvR0KzDpzMT4OpgqzoSkUFYmsikaTQC706Ph7eLHR5atJ+DL4kswJvrs7Avrxpv3NQHPQNcVcchMhhLE5k8L2c7fHRrXxSfOo1nvj/I85uIzNimjDLM35GLOwZ3xeT4YNVxiC4JSxOZhYSuXnh2XC/8dLgMX+zMUx2HiC7DiepG/H3ZQcQEu+GFCb1VxyG6ZCxNZDbuGRaO0VH+eH1dJlLyq1XHIaJL0Nqmx2PfHkCbXuKjW/rB3oYDLMn8sDSR2RBC4L/T4hDk4YjHvj2Amkae30RkLv638Sj2F5zCf27sgzAfZ9VxiC4LSxOZFXdHW3x4S1+U1Tbh2eVpPL+JyAxsOVKOOVuP45YBXXB9XJDqOESXjaWJzE5cqAeeHtMT69NLsWRfoeo4RHQBZbVN+Nt3B9HT3xX/mhSlOg7RFWFpIrN07/BuGB7hg5dXH0Z2WZ3qOER0Dm16iceXHMDpljZ8fFtf3oiXzJ5BpUkI4SGE+F4IkSWEyBRCDDZ2MKIL0WgE/jctDs52Nnj02wNoam1THYmI/mTO1uPYk1OFVyZHo4cf5zGR+TN0pel9ABuklL0AxAHINF4kIsP4uTng7WlxyCqtw+vr+CVJZEpSC0/h3U1HMTE2EFMTQlTHIeoQFy1NQgh3ACMAfA4AUsoWKeUpYwcjMsTVvfxwz7BwfLU7H5syylTHISIADc06PLHkAPxc7fHalD68rxxZDENWmsIBVAD4UghxQAgxXwjB60XJZDwztieig9zwzPcHUV7bpDoOkdV7ZXUG8qsa8c70eLg78b5yZDkMKU02APoB+FRK2RdAA4Bn//wgIcR9QohkIURyRUVFB8ckOj97Gy3en9EXjS1teOYHjiEgUmn9oRIsTS7EgyO7Y1A3b9VxiDqUIaXpBIATUsqk9t9/jzMl6g+klHOllIlSykRfX9+OzEh0UT38XPD8+N7YcqQCi5IKVMchskolNafx7PJDiA1xx5PXRaqOQ9ThLlqapJSlAAqFED3b33UtgAyjpiK6DLcP6orhET54bW0mcisbVMchsip6vcTflx1Ei06P92f0ha2WE23I8hj6Vf0ogEVCiDQA8QD+Y7xIRJdHoxH479Q42Nlo8OTSVOja9KojEVmNBbvysPPYSfxrUhTCeZsUslAGlSYpZWr71luslHKKlJJ3SyWTFODugH9PiUFq4Sl8suW46jhEVuF4RT3e3JCFa3v5YXr/UNVxiIyG66dkcSbFBWFyfBA++CUbaSc4HYPImHRtevx92UE42Grx+o0cL0CWjaWJLNIr18fAx8UeTy5N5bRwIiOauz0HBwpO4dUpMfBzc1Adh8ioWJrIIrk72eLtaXE4XtGAdzcdVR2HyCJlldbi3U1HMaFPICbFBqqOQ2R0LE1ksYZF+OCWAV0wb3sODhTwNDyijtSi0+NvSw/C3dEWr06J4bYcWQWWJrJoz4/vhQA3Bzz9fRq36Yg60Eebs5FRUovXb4yFl7Od6jhEnYKliSyaq4MtXr8pFsfK6/H+L9mq4xBZhEMnavDxluO4sV8wrovyVx2HqNOwNJHFGxnpi+mJofhs63EcLOTVdERXorVNj6e/PwhvZzv8a1K06jhEnYqliazCCxN7w8/VAU9/fxDNOm7TEV2uudtykFVah39PiYG7I2/GS9aFpYmsgpuDLV6/sQ+OltXjo83HVMchMkvHyuvx/s/ZmBAbiNHRAarjEHU6liayGlf38sPUhBB8suU4DhfXqI5DZFb0eol//JAGRzstXuK2HFkpliayKv+cEAVPJzs8t/wQ2vRSdRwis7FwTz5S8qvx4sQo+Lraq45DpARLE1kVdydbvDgpCmknavD17jzVcYjMwonqRry5IQsjIn1xY79g1XGIlGFpIqszKTYQV/X0xds/HUHxqdOq4xCZNCklXliRDgD4zw0cYknWjaWJrI4QAq9OjoFeAi+uTIeU3KYjOp8fU4uw9WgFnhnTEyGeTqrjECnF0kRWKdTLCU9eF4GfM8uxIb1UdRwik1TT2Ip/r8lEfKgHbh8cpjoOkXIsTWS17h4ajqhAN/xr1WHUNrWqjkNkct76KQvVjS147YYYaDXcliNiaSKrZaPV4I2b+qCyvhlvbchSHYfIpOwvqMbivQWYNTQc0UHuquMQmQSWJrJqsSEeuHNIGBYlFWB/QbXqOEQmQdemxwsr0uHv6oAnr4tUHYfIZLA0kdV7anRP+Lna48WV6ZzdRATgq935yCypxb8mRcHF3kZ1HCKTwdJEVs/F3gb/NyEK6UXCaFmwAAAgAElEQVS1WLy3QHUcIqVKak7jnY1HcHVPX4yN4a1SiM7G0kQEYGJsIIZ098bbPx3Byfpm1XGIlHl1TQZ0eolXJnMmE9GfsTQR4czsppevj0ZDsw5vbTiiOg6REr8eKce6Q6V47NoIhHpxJhPRn7E0EbWL8HfFrKFhWJpciAM8KZysTLOuDa+szkA3X2fcO7yb6jhEJomliegsj4+KhL+bPV5ceZgnhZNV+XJnHnIrG/CvSdGws+GPBqJz4SuD6Cwu9jZ4fnxvHCqqwZJ9PCmcrEN5bRM+/CUbo3r7Y2Skr+o4RCaLpYnoT66PC8LAcC+8teEIqhpaVMchMro3NmShtU3inxN7q45CZNJYmoj+RAiBV6fEoL5Zh3c28aRwsmz7C6qxfH8RZg8PR1dvZ9VxiEwaSxPROUT6u2LmwC5YnFSAo2V1quMQGYVeL/HSqsPwd7PHw1f3UB2HyOSxNBGdxxOjIuFib4NX12RASp4UTpbn+5QTSDtRg+fG9YYzJ38TXRRLE9F5eDrb4bFrI7A9uxJbjlSojkPUoWqbWvHWT1lI6OqJyfFBquMQmQWWJqILuGNwGMJ9nPHvtRlobdOrjkPUYT78JRsnG1rw0qRoTv4mMhBLE9EF2Nlo8Pz43jhe0YDFSRxBQJah4GQjFuzKw9R+IegT4q46DpHZYGkiuohRvf0wpLs33v35KGoaW1XHIbpib/2UBRuNBk+N7qk6CpFZYWkiugghBP5vQhRqTrfi/V+yVcchuiL7C6qxJq0E947ohgB3B9VxiMwKSxORAaKC3DCjfyi+3p2HnIp61XGILouUEv9ZmwkfF3vcP4L3lyO6VCxNRAb623U94WCrxZsbslRHIbosPx0uQ3J+Nf52XSRHDBBdBpYmIgP5utrj3uHd8NPhMuwvqFYdh+iStOj0eGN9JiL8XHBzYojqOERmiaWJ6BLMHh4OHxc7vLk+iwMvyawsTspH3slGPDe+F2y0/NZPdDn4yiG6BM72Nnj0mggk5VZhy1EOvCTzUNt05iKGId29cXVPP9VxiMwWSxPRJbplQBd08XLCWxuOQK/nahOZvk9+PY5Tp1vx/PjeHGRJdAVYmogukZ2NBk+NjkRmSS1WHSxWHYfogspqm7BgVy6mxAcjJpiDLImuBEsT0WWYFBuE6CA3/G/TEbToeHsVMl0fbT4GXZvEk6MiVUchMnssTUSXQaMReGZsLxRWncbipHzVcYjOqbCqEd/uLcD0/qHo4u2kOg6R2WNpIrpMIyJ8MLibNz7cfAz1zTrVcYj+4r2fs6HVCDx6TYTqKEQWgaWJ6DIJIfCPcb1wsqEF87blqI5D9AfZZXVYceAE7hwSxtulEHUQliaiKxAf6oGx0QH4Ykcub+ZLJuWdTUfhZGeDB0Z2Vx2FyGKwNBFdocdHRaCuWYf5O7jaRKbh0IkarE8vxT3DwuHlbKc6DpHFYGkiukK9A90wvk8AvtyZh1ONLarjEOHtjUfg4WSL2cPDVUchsigsTUQd4PFrI9HQosO87VxtIrX25lZh69EKPDiyO1wdbFXHIbIoLE1EHaBngCsm9AnEgp15qGrgahOpIaXE2z8dgZ+rPe4YHKY6DpHFYWki6iCPXxuBxtY2zOWVdKTI7pyT2JtXhYeu6g5HO63qOEQWh6WJqINE+LtiUmwQvt6dh5P1zarjkBX64Jds+LnaY8aALqqjEFkkliaiDvTYtRFo4moTKbA3twp7cqpw/8jucLDlKhORMbA0EXWgHn4umBwfjK9356OijqtN1Hk+3JwNHxc73MpVJiKjYWki6mCPXtMDzbo2fLb1uOooZCVS8quxPbsS943oxnOZiIyIpYmog3XzdcGU+GAsSirglXTUKT7cnA0vZzvcNrCr6ihEFo2licgIHryqO063tmHBzlzVUcjCHSw8hS1HKjB7eDic7W1UxyGyaCxNREYQ4e+KMdH+WLArD/XNOtVxyIJ9uDkbHk62nMtE1AlYmoiM5KGreqC2SYfFSfmqo5CFSi+qwc+Z5bhnaDhcuMpEZHQsTURGEhfqgaE9vDFvey6aWttUxyEL9OHmbLg62ODOoWGqoxBZBZYmIiN6+KoeqKhrxg/7T6iOQhYmu6wOPx0uw6whYXDjPeaIOgVLE5ERDe7ujbhQD3y2NQe6Nr3qOGRB5m7LgYOtBncNDVcdhchqsDQRGZEQAg9d1R0FVY1Ye6hEdRyyEKU1TfgxtQjTE0Ph5WynOg6R1WBpIjKy63r7I8LPBZ9uOQ4ppeo4ZAG+3JmLNr3E7OHdVEchsiosTURGptEIPHhVd2SV1mFzVrnqOGTmaptasSipABNigxDq5aQ6DpFVYWki6gST4oIQ7OGIj389pjoKmbnFSQWob9bh/hFcZSLqbCxNRJ3AVqvBfSO6YX/BKaTkV6uOQ2aqWdeGL3bkYlgPH8QEu6uOQ2R1WJqIOsnUhBC4Odjgix28tQpdnpUHilFe14wHRnZXHYXIKrE0EXUSZ3sb3DKwC9anl6CwqlF1HDIzer3EnG3HER3khqE9vFXHIbJKLE1EnejOwWEQQuCrXXmqo5CZ+TmzDDkVDbh/ZHcIIVTHIbJKLE1EnSjIwxET+gRiyb5C1DW1qo5DZuSzbTkI8XTE+JgA1VGIrJbBpUkIoRVCHBBCrDFmICJLN3t4OOqbdfgumbdWIcOk5FcjJb8as4eFw0bLf+sSqXIpr77HAWQaKwiRtYgN8UD/MM/fBxQSXcyCXXlwdbDBtMRQ1VGIrJpBpUkIEQJgAoD5xo1DZB3uGdYNJ6pPY+PhUtVRyMSV1jRh/aESTE8MhbO9jeo4RFbN0JWm9wA8A+C8dxwVQtwnhEgWQiRXVFR0SDgiS3VdlD+6eDlhPscP0EUs3JMHvZS4c0iY6ihEVu+ipUkIMRFAuZQy5UKPk1LOlVImSikTfX19OywgkSXSagRmDQ1DSn41DhRw2CWdW1NrGxYnFWBUb3/eMoXIBBiy0jQUwPVCiDwASwBcI4T4xqipiKzAtMRQuNrb4HOuNtF5rEotRnVjK+4aGqY6ChHBgNIkpXxOShkipQwDMAPAZinlTKMnI7JwLr8PuyxFSc1p1XHIxEgp8cXOXPQKcMXgbhxmSWQKeO0qkUIzB3aFXkp8u7dQdRQyMXtyqpBVWodZQ8M4zJLIRFxSaZJSbpFSTjRWGCJr08XbCVdF+uLbvQVobTvvdRZkhRbsyoWnky0mxwerjkJE7bjSRKTY7YO7oqKuGRsPl6mOQiaisKoRmzLKcMuALnCw1aqOQ0TtWJqIFBsZ6YcQT0cs3JOnOgqZiK9350EIgdsHd1UdhYjOwtJEpJhWI3DbwK7Yk1OF7LI61XFIsYZmHZbsK8TYmAAEujuqjkNEZ2FpIjIBNyeGwE6rwTd78lVHIcVWHSxGXZMOszjMksjksDQRmQBvF3tMiA3ED/uL0NCsUx2HFFqUlI9eAa5I6OqpOgoR/QlLE5GJmDmoK+qbdfgxtUh1FFIk7cQppBfV4raBXThmgMgEsTQRmYh+XTwQFeiGhbvzIaVUHYcUWLSnAI62WkzuyzEDRKaIpYnIRPx2tVRWaR1S8nk/OmtT29SKVQeLMTk+CG4OtqrjENE5sDQRmZDJ8UFwtbfBQp4QbnV+PFCE061tuHVgF9VRiOg8WJqITIiTnQ1uSgjBukMlqKxvVh2HOomUEouTCtAn2B2xIR6q4xDRebA0EZmY2wZ2QWubxIr9PCHcWuwvqEZWaR1XmYhMHEsTkYmJ8HdF3y4eWJpcyBPCrcSipAK42Nvg+rgg1VGI6AJYmohM0PTEUBwrr8eBwlOqo5CRnWpswZq0EkzpGwRnexvVcYjoAliaiEzQxLggONlp8d2+QtVRyMh+2F+EFp0etw7gfeaITB1LE5EJcrG3wYQ+gVh9sJgTwi2YlBKLkvLRt4sHooLcVMchootgaSIyUdP7h6KhpQ1rD5WojkJGkpRbhZyKBtw2kKtMROaApYnIRCV09UQ3X2du0Vmw75IL4dq+qkhEpo+lichECSFwc2IokvOrcbyiXnUc6mD1zTqsP1SKiXFBcLTTqo5DRAZgaSIyYTf2C4ZWI/BdMlebLM3atGKcbm3DtMQQ1VGIyEAsTUQmzM/VAdf08sMPKUVobdOrjkMdaFnyCXT3dUbfUE4AJzIXLE1EJm56Yigq65vxa1a56ijUQXIrG5CcX42pCaEQQqiOQ0QGYmkiMnFX9fSFn6s9t+gsyPcphdCIM9uvRGQ+WJqITJyNVoObEkLw65EKlNc2qY5DV6hNL/FDShFGRvrC381BdRwiugQsTURmYFpCCNr0EitTi1VHoSu041glSmubMC0xVHUUIrpELE1EZqCbrwviQz2w4kCR6ih0hZYlF8LDyRbX9vZTHYWILhFLE5GZuKFvMDJKanGktE51FLpMNY2t2JhRhslxQbC34WwmInPD0kRkJibGBkKrEfgxlatN5mpVWjFadHpuzRGZKZYmIjPh7WKPkZG+WHmgCHq9VB2HLsP3yYXoFeCKaN6cl8gssTQRmZEpfYNRXNOEpNwq1VHoEh0tq8PBEzWYmhDC2UxEZoqliciMXNfbH852WvzIE8LNzg8pJ2CjEZjSl7OZiMwVSxORGXG002JsTCDWHSpBU2ub6jhkIL1eYtXBYoyI9IWPi73qOER0mViaiMzMDX2DUdesw2beVsVsJOVWoaSmCZPjg1RHIaIrwNJEZGYGd/eGv5s9lu/nFp25WHWwCE52WlwX5a86ChFdAZYmIjOj1QhMjg/GliPlqGpoUR2HLqJZ14a1aSUYEx0AJzsb1XGI6AqwNBGZoSnxwdDpJdYeKlEdhS5iy5EK1DbpcD235ojMHksTkRnqHeiKnv6uvIrODKxKLYa3sx2G9/BRHYWIrhBLE5EZEuLMpesp+dUoONmoOg6dR11TK37OLMPE2EDYaPntlsjc8VVMZKZ+uxJrJW+rYrI2pJeiWafHZM5mIrIILE1EZirIwxGJXT15XpMJW5lajC5eTugb6qE6ChF1AJYmIjM2ITYQWaV1OFZerzoK/Ul5bRN2Ha/E5Pgg3jaFyEKwNBGZsfF9AiEEsDaNq02mZnVaCfQSmBzPrTkiS8HSRGTG/N0c0D/MC2sPFauOQn+yMrUIMcFu6OHnojoKEXUQliYiMzcxNhBHy+pxtKxOdRRql1NRj7QTNZgcx1UmIkvC0kRk5sbGBHCLzsSsTC2GEMCkOA60JLIkLE1EZs7P1QEDw72wJq0YUkrVcayelBJr0ooxMNwLAe4OquMQUQdiaSKyABNjg3C8ogFHuEWn3JGyOhyvaMDEWK4yEVkaliYiCzA2JgAabtGZhLVpJdCIM88JEVkWliYiC+DjYo/B3b2xNq2EW3QKSSmxNq0Eg7p5w8fFXnUcIupgLE1EFmJCnyDkVDYgs4RbdKpkldYhp7IBE2IDVUchIiNgaSKyEGNjAqDVCM5sUuj3rblobs0RWSKWJiIL4eVshyHdvbGGW3RKSCmx9lAJhnT3gTe35ogsEksTkQWZGBuI/JONOFxcqzqK1ckoqUUut+aILBpLE5EFGRMdABuNwBpeRdfp1qaVQKsRGMOtOSKLxdJEZEE8nOwwuLs3fjpcyi26TvT/t+a84eVspzoOERkJSxORhRkTHYDcygZkl9erjmI1DhfXIv9kIyb04dYckSVjaSKyMKOj/CEEsCG9VHUUq7H2ELfmiKwBSxORhfFzc0BCF0+Wpk7y20DLoT184MmtOSKLxtJEZIHGxgQgo6QWhVWNqqNYvPSiWhRUNWIit+aILB5LE5EF+m2b6KfDXG0ytjWHimGjERgd7a86ChEZGUsTkQUK9XJCVKAbt+iMTEqJ9YdKMaSHDzycuDVHZOlYmogs1NiYAKQUVKO8tkl1FIt1uPjM1tz4GJ4ATmQNWJqILNTYmABICWzMKFMdxWJtSC+FRgDXRXFrjsgasDQRWagIPxeE+zjzvCYjWp9egoHh3rzXHJGVYGkislBCnJkbtPv4SdQ0tqqOY3Gyy+pwvKIB4/pwa47IWrA0EVmwsTEB0OklfsniFl1HW59eCiHAgZZEVoSliciCxQa7I9DdgVfRGcH69FIkdPGEv5uD6ihE1ElYmogsmEYjMDrKH1uPVqCxRac6jsXIq2xAZkktxvKqOSKrwtJEZOHGxASgWafHtqMVqqNYjPXtK3csTUTWhaWJyMINCPOCp5Pt7z/o6cptSC9BbIg7QjydVEchok7E0kRk4Wy0Gozq7Y/NWeVobdOrjmP2ik6dxsETNVxlIrJCLE1EVuC6KH/UNemQlFOlOorZ++2k+nExvEEvkbW5aGkSQoQKIX4VQmQIIQ4LIR7vjGBE1HGGR/jCwVaDjRncortSG9JL0CvAFeE+zqqjEFEnM2SlSQfgKSllFIBBAB4WQkQZNxYRdSRHOy1GRPhiU0YZpJSq45it8romJOdXc5WJyEpdtDRJKUuklPvb364DkAkg2NjBiKhjjY4OQElNE9KLalVHMVs/HS6DlOAUcCIrdUnnNAkhwgD0BZB0jo/dJ4RIFkIkV1Tw0mYiU3NtLz9oBLhFdwU2pJegm68zIvxcVEchIgUMLk1CCBcAPwB4Qkr5l3+qSinnSikTpZSJvr6+HZmRiDqAp7Md+od5YeNh3lLlcpysb8aenCqMiwmAEEJ1HCJSwKDSJISwxZnCtEhKudy4kYjIWEZHB+BIWR3yTzaojmJ2NmWUoU0vMb4Pz2cislaGXD0nAHwOIFNK+Y7xIxGRsYyO8gdwpgDQpVmXXoqu3k6ICnRTHYWIFDFkpWkogNsBXCOESG3/Nd7IuYjICEK9nNA70I1bdJfoVGMLdh2rxLiYQG7NEVkxm4s9QEq5AwC/SxBZiNFR/vhwczYq65vh42KvOo5Z2JRRBp1eYjyvmiOyapwITmRlrovyh14CmzPLVUcxG+vTSxHs4Yg+we6qoxCRQixNRFYmOsgNwR6OHD1goNqmVmzPrsD4PrxqjsjasTQRWRkhBK6L8sf27Eo0tuhUxzF5v2SWobVNYhyvmiOyeixNRFZodLQ/mnV6bDtaqTqKyVt3qBSB7g6ID/FQHYWIFGNpIrJCA8K84O5oi42HuUV3IXVNrdh6tAJjYwKg0XBrjsjasTQRWSEbrQbX9vbDz5llaNHpVccxWZuzytGi03OgJREBYGkislrjYgJR26TD7pyTqqOYrPWHSuHnao+ELp6qoxCRCWBpIrJSwyN84GynxYb0EtVRTFJDsw6/Hinn1hwR/Y6lichKOdhqcXUvP2w8fOaeavRHW45UoFmnx7gYbs0R0RksTURWbFxMIE42tGBvbpXqKCZnXXoJfFzsMCDcS3UUIjIRLE1EVuyqnr5wsNVwi+5PGlt0+DWrHKOjA6Dl1hwRtWNpIrJizvY2GBnpiw2HS6HnFt3vNh4uQ2NLGybHBamOQkQmhKWJyMqNiwlEWW0zDhSeUh3FZCw/UIRgD0f0D+PWHBH9fyxNRFbumt5+sNUKbtG1K69rwo7sCkzpG8Sr5ojoD1iaiKycm4MthvXwwfr0UkjJLbpVqcXQS+CGvsGqoxCRiWFpIiKMiwnEierTSC+qVR1FuRUHitAn2B09/FxVRyEiE8PSRES4LsofWo3AeivfojtaVofDxbVcZSKic2JpIiJ4OtthUDcvbLDyLboVB4qg1QhM4lVzRHQOLE1EBAAYGxOInMoGHC2rVx1FCb1eYuWBIgyP8IGvq73qOERkgliaiAgAMCbaH0LAarfoknKrUFzTxK05IjovliYiAgD4uTqgf1cvrDtUYpVbdCsOnICznRajowJURyEiE8XSRES/mxQfhKNl9ThcbF1X0TW1tmH9oVKMjQmEo51WdRwiMlEsTUT0u+vjgmBvo8F3yYWqo3SqnzPLUNesw439uDVHROfH0kREv3N3tMXYmAD8eKAITa1tquN0mhX7i+DvZo9B3bxVRyEiE8bSRER/MC0hFLVNOmzKKFMdpVOU1zVh69EKTIkPhpa3TSGiC2BpIqI/GNLdG8EejlazRbdgZx7apMT0/qGqoxCRiWNpIqI/0GgEpiaEYMexShSdOq06jlHVN+uwcE8+xkYHoJuvi+o4RGTiWJqI6C+mJoRASmB5ygnVUYzq26QC1DXp8MDI7qqjEJEZYGkior8I9XLCkO7eWJZyAnq9Zc5satHp8fmOXAzq5oW4UA/VcYjIDLA0EdE53ZwYioKqRiTlVqmOYhQrU4tQWtvEVSYiMhhLExGd09iYALg62GCZBZ4QrtdLfLYtB70D3TAy0ld1HCIyEyxNRHRODrZaXB8XhHXpJahralUdp0NtzirHsfJ6PDCyG4TgmAEiMgxLExGd17TEUDS16rEmzbJu4jtn63EEezhiQp9A1VGIyIywNBHRecWFuCPS3wVL91nOFl1yXhWS86tx7/Bw2Gj5LZCIDMfvGER0XkIIzOjfBamFp7DrWKXqOB1iztYceDrZ4mYOsySiS8TSREQXdOvALgj2cMS/12aa/fiBtBOn8HNmGe4YHAYnOxvVcYjIzLA0EdEFOdhq8czYnsgoqcXyA0Wq41y22qZWPPrtAQS6O2DW0DDVcYjIDLE0EdFFXR8XhLhQD7z90xGcbmlTHeeSSSnx3A+HcKL6ND68pS88nOxURyIiM8TSREQXJYTA/03ojdLaJszbnqM6ziX7Zk8+1h4qwdNjeiIxzEt1HCIyUyxNRGSQ/mFeGBsdgDlbj6O8tkl1HIOlF9Xg1TWZuLqnL+4b3k11HCIyYyxNRGSwZ8f1QmubHu9sOqo6ikFqm1rx8OL98Haxw/9ujodGw0GWRHT5WJqIyGBhPs64fVAYvksuRFZpreo4F/Tn85i8nHkeExFdGZYmIrokj13bA64OtnhtbSakNM0RBIVVjXjwm/08j4mIOhRLExFdEg8nOzx2bQS2Z1fi+RXpaG3Tq470u8YWHd7ZeASj3tmKLUfL8ffRkTyPiYg6DKe7EdElmzUkDFUNzfj41+PIP9mAT29LgLuTrbI8ujY91qWX4vV1mSipacL1cUF4dlwvBHk4KstERJaHpYmILplGI/D0mF7o5uOCZ5en4YZPduLzu/oj3Mf5ij5vs64NpxpbUd3YglONrTjV2ILTrW2QEtBLQC8lpJSoPa1DflUD8k82orCqESeqT0Onl4gJdsMHt/RFf27HEZERCGOck5CYmCiTk5M7/PMSkenZm1uF+xcmQy+BOTMTMLi790X/TH2zDkdK69p/1SKrtA5Hy+pQ3dhq8P/X3dEWXb2dEOrlhK5eTogOcsfYmABoeYUcEV0iIUSKlDLxoo9jaSKiK5V/sgH3fJWMnIp6dPV2RldvJ4R5OyPcxxkhno4oq23GsfJ6ZJfX4Xh5PYpr/v+cJ2c7LSIDXNErwBUhnk5wd7SFp5MdPJ1s4e5kC0dbLbQaAY0QEALQCAFnOxul24FEZFkMLU3cniOiK9bV2xnLHxqCz7fnIru8DrmVjdibW4XGs2654mirRXc/Zwzs5o0efi6I9D9TlII9HDk/iYjMAksTEXUINwdbPHld5O+/l1Kioq4ZhdWn4e9mjyB3liMiMm8sTURkFEII+Lk5wM/NQXUUIqIOwTlNRERERAZgaSIiIiIyAEsTERERkQFYmoiIiIgMwNJEREREZACWJiIiIiIDsDQRERERGYCliYiIiMgALE1EREREBmBpIiIiIjIASxMRERGRAViaiIiIiAzA0kRERERkAJYmIiIiIgOwNBEREREZQEgpO/6TClEBIL/DP/Ef+QCoNPL/w1RZ87ED1n381nzsgHUfP4/delnz8XfWsXeVUvpe7EFGKU2dQQiRLKVMVJ1DBWs+dsC6j9+ajx2w7uPnsVvnsQPWffymduzcniMiIiIyAEsTERERkQHMuTTNVR1AIWs+dsC6j9+ajx2w7uPnsVsvaz5+kzp2sz2niYiIiKgzmfNKExEREVGnMenSJISYJoQ4LITQCyES//Sx54QQx4QQR4QQY87z58OFEEntj1sqhLDrnOQdqz17avuvPCFE6nkelyeEONT+uOTOzmksQoiXhBBFZ/0djD/P48a2fz0cE0I829k5jUEI8V8hRJYQIk0IsUII4XGex1nMc3+x51EIYd/+mjjW/voO6/yUxiGECBVC/CqEyGj/3vf4OR5zlRCi5qzXw4sqshrDxb6OxRkftD/3aUKIfipyGoMQoudZz2mqEKJWCPHEnx5jMc+9EOILIUS5ECL9rPd5CSE2CSGy2//reZ4/e2f7Y7KFEHd2XmoAUkqT/QWgN4CeALYASDzr/VEADgKwBxAO4DgA7Tn+/HcAZrS/PQfAg6qPqQP+Tv4H4MXzfCwPgI/qjEY45pcA/P0ij9G2fx10A2DX/vURpTp7Bxz7aAA27W+/CeBNS37uDXkeATwEYE772zMALFWduwOPPxBAv/a3XQEcPcfxXwVgjeqsRjr+C34dAxgPYD0AAWAQgCTVmY3096AFUIozs4Ms8rkHMAJAPwDpZ73vLQDPtr/97Lm+3wHwApDT/l/P9rc9Oyu3Sa80SSkzpZRHzvGhyQCWSCmbpZS5AI4BGHD2A4QQAsA1AL5vf9dXAKYYM6+xtR/TzQC+VZ3FBA0AcExKmSOlbAGwBGe+TsyalHKjlFLX/ts9AEJU5ukEhjyPk3Hm9QyceX1f2/7aMHtSyhIp5f72t+sAZAIIVpvKpEwG8LU8Yw8ADyFEoOpQRnAtgONSSmMPiVZGSrkNQNWf3n32a/t8P7PHANgkpaySUlYD2ARgrNGC/olJl6YLCAZQeNbvT+Cv31i8AZw66wfOuR5jboYDKJNSZp/n4xLARiFEihDivk7M1RkeaV+O/+I8S7aGfE2Yu7tx5l/Z52Ipz70hz+Pvj2l/fdfgzOvdorRvO/YFkHSODw8WQhwUQqwXQkR3ajDjutjXsTW8zoEzK6jn+8expT73AOAvpQG6WXAAAANVSURBVCxpf7sUgP85HqP0a8Cms/5H5yOE+BlAwDk+9IKUcmVn51HFwL+HW3DhVaZhUsoiIYQfgE1CiKz2Nm/yLnT8AD4F8CrOfEN9FWe2KO/uvHTGZchzL4R4AYAOwKLzfBqzfe7pr4QQLgB+APCElP+vvbt3jSII4zj+fSC+QJCgWJgQCwP5CxQRsTMEEySgWFj52qSwFsTOP8BOGxUEsRJUDgkEfOkVgkkUFWPlhZCAhSKCWDwWMwfjsqdjTO6y6+8DS+525o6Zm5nbJzsziX8pJM8Qpm2+xvV9D4HhTpdxnfz3/TiuvZ0ALpUk17ntf+HubmYbbnt/14Mmdx9ZxcsWgd3J88F4LvWJcOu2J/42WpZnw/jT52BmPcBxYO9v3mMx/lwxsweEqY5KfOHk9gMzuwE8KknK6RMbUkbbnwGOAoc9TuqXvEdl274gpx1beZpxXPQRxnstmNkmQsB0193vF9PTIMrdp8zsupntdPfK/2+yjH5c2XH+F8aAGXdfLibUue2jZTPrd/elOO26UpJnkbC2q2WQsO65I6o6PdcATsZdNHsIkfbzNEO8uDwDTsRTp4Eq37kaAd66e7Ms0cx6zWxb6zFhAfGrsrxVU1izcIzyer0Ahi3smNxMuL3d6ET51pOZHQEuAhPu/q1Nnjq1fU47NgjjGcL4ftoumKyauDbrFvDG3a+2ybOrtYbLzPYTvscrHzRm9uMGcCruojsAfE6mc+qi7YxCXds+kY7tdtfsaWDUzLbHpRqj8VxndGrF+WoOwgWyCXwHloHpJO0yYZfNO2AsOT8FDMTHQ4RgagG4B2zpdp3+4bO4DUwWzg0AU0ldZ+PxmjC10/Vyr1Hd7wDzwBxhUPUX6x+fjxN2G32oS/1j3/0IvIxHa9dYbdu+rB2BK4TAEWBrHM8LcXwPdbvMa1j3Q4Rp6LmkzceBydb4By7Edp4lbA442O1yr1HdS/txoe4GXIt9Y55kV3UdDqCXEAT1Jedq2faEwHAJ+BGv8+cJaxOfAO+Bx8COmHcfcDN57bk4/heAs50st/4iuIiIiEiGqk7PiYiIiHSUgiYRERGRDAqaRERERDIoaBIRERHJoKBJREREJIOCJhEREZEMCppEREREMihoEhEREcnwEw0+t+9dlW06AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,7))\n",
    "plt.plot(x,y)\n",
    "#plt.savefig(\"/Users/brandonbrown/Dropbox/DeepReinforcementLearning/media/Appendix/grad_desc1.pdf\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 297,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(x): #A\n",
    "    return np.log(np.power(x,4) + np.power(x,3) + 2)\n",
    "\n",
    "def dfdx(x): #B\n",
    "    return (4*np.power(x,3) + 3*np.power(x,2)) / f(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 314,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = -9.41\n",
    "lr = 0.001\n",
    "epochs = 5000\n",
    "for i in range(epochs):\n",
    "    deriv = dfdx(x)\n",
    "    x = x - lr * deriv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 315,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.7500000134493898"
      ]
     },
     "execution_count": 315,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nn(x,w1,w2):\n",
    "    l1 = x @ w1 #A\n",
    "    l1 = np.maximum(0,l1) #B\n",
    "    l2 = l1 @ w2\n",
    "    l2 = np.maximum(0,l2)\n",
    "return l2\n",
    "\n",
    "w1 = np.random.randn(784,200) #C\n",
    "w2 = np.random.randn(200,10)\n",
    "x = np.random.randn(784) #D\n",
    "\n",
    "#A Matrix multiplication\n",
    "#B Non-linear activation function\n",
    "#C Weight (parameter) matrix, initialized randomly\n",
    "#D Random input vector\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [],
   "source": [
    "nn(x,w1,w2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nn(x,w1,w2):\n",
    "    l1 = x @ w1 #A\n",
    "    l1 = torch.relu(l1) #B\n",
    "    l2 = l1 @ w2\n",
    "    l2 = torch.relu(l2)\n",
    "    return l2\n",
    "\n",
    "w1 = torch.randn(784,200,requires_grad=True) #C\n",
    "w2 = torch.randn(200,10,requires_grad=True)\n",
    "x = torch.randn(784) #D\n",
    "\n",
    "#A Matrix multiplication\n",
    "#B Non-linear activation function\n",
    "#C Weight (parameter) matrix, initialized randomly\n",
    "#D Random input vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([  0.0000,   0.0000,   0.0000, 454.4205, 395.5204, 153.6160, 337.1095,\n",
       "        328.5044, 324.0454,  88.7795], grad_fn=<ReluBackward0>)"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nn(x,w1,w2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 289,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torchvision as TV\n",
    "\n",
    "def nn(x,w1,w2):\n",
    "    l1 = x @ w1 #A\n",
    "    l1 = torch.relu(l1) #B\n",
    "    l2 = l1 @ w2\n",
    "    return l2\n",
    "\n",
    "w1 = torch.randn(784,200,requires_grad=True) #C\n",
    "w2 = torch.randn(200,10,requires_grad=True)\n",
    "\n",
    "#A Matrix multiplication\n",
    "#B Non-linear activation function\n",
    "#C Weight (parameter) matrix, initialized randomly\n",
    "#D Random input vector"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 290,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.5, 27.5, 27.5, -0.5)"
      ]
     },
     "execution_count": 290,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,7))\n",
    "plt.imshow(mnist_data.train_data[0])\n",
    "plt.axis('off')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 291,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist_data = TV.datasets.MNIST(\"MNIST\", train=True, download=False) #A\n",
    "\n",
    "lr = 0.0001\n",
    "epochs = 2500\n",
    "batch_size = 1000\n",
    "losses = []\n",
    "lossfn = torch.nn.CrossEntropyLoss() #B\n",
    "for i in range(epochs):\n",
    "    rid = np.random.randint(0,mnist_data.train_data.shape[0],size=batch_size) #C\n",
    "    x = mnist_data.train_data[rid].float().flatten(start_dim=1) #D\n",
    "    x /= x.max() #E\n",
    "    pred = nn(x,w1,w2) #F\n",
    "    target = mnist_data.train_labels[rid] #G\n",
    "    loss = lossfn(pred,target) #H\n",
    "    losses.append(loss)\n",
    "    loss.backward() #I\n",
    "    with torch.no_grad(): #J\n",
    "        w1 -= lr * w1.grad #K\n",
    "        w2 -= lr * w2.grad\n",
    "        \n",
    "#A Download and load the MNIST dataset\n",
    "#B Setup a loss function\n",
    "#C Get a set of random index values\n",
    "#D Subset the data and flatten the 28x28 images into 784 vectors\n",
    "#E Normalize the vector to be between 0 and 1\n",
    "#F Make a prediction using the neural network\n",
    "#G Get the ground-truth image labels\n",
    "#H Compute the loss\n",
    "#I Backpropagate\n",
    "#J Do not compute gradients in this block\n",
    "#K Gradient descent over the parameter matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 296,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10,7))\n",
    "plt.xlabel(\"Training Time\", fontsize=22)\n",
    "plt.ylabel(\"Loss\", fontsize=22)\n",
    "plt.plot(losses)\n",
    "#plt.savefig(\"/Users/brandonbrown/Dropbox/DeepReinforcementLearning/media/Appendix/loss1.png\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 293,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "rid = np.random.randint(0,mnist_test.test_data.shape[0],size=batch_size) #C\n",
    "x = mnist_test.test_data[rid].float().flatten(start_dim=1) #D\n",
    "x /= x.max() #E\n",
    "pred = nn(x,w1,w2) #F\n",
    "pred_label = torch.log_softmax(pred, dim=1).argmax(dim=1)\n",
    "target = mnist_test.test_labels[rid] #G\n",
    "num_cor = (pred_label == target).sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 294,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.6100)"
      ]
     },
     "execution_count": 294,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "num_cor.float() / 100.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mnist_data = TV.datasets.MNIST(\"MNIST\", train=True, download=False) #A\n",
    "\n",
    "lr = 0.001\n",
    "epochs = 5000\n",
    "batch_size = 500\n",
    "losses = []\n",
    "lossfn = torch.nn.CrossEntropyLoss() #B\n",
    "optim = torch.optim.Adam(params=[w1,w2],lr=lr)\n",
    "for i in range(epochs):\n",
    "    rid = np.random.randint(0,mnist_data.train_data.shape[0],size=batch_size) #C\n",
    "    x = mnist_data.train_data[rid].float().flatten(start_dim=1) #D\n",
    "    x /= x.max() #E\n",
    "    pred = nn(x,w1,w2) #F\n",
    "    target = mnist_data.train_labels[rid] #G\n",
    "    loss = lossfn(pred,target) #H\n",
    "    losses.append(loss)\n",
    "    loss.backward() #I\n",
    "    optim.step()\n",
    "    optim.zero_grad()\n",
    "        \n",
    "#A Download and load the MNIST dataset\n",
    "#B Setup a loss function\n",
    "#C Get a set of random index values\n",
    "#D Subset the data and flatten the 28x28 images into 784 vectors\n",
    "#E Normalize the vector to be between 0 and 1\n",
    "#F Make a prediction using the neural network\n",
    "#G Get the ground-truth image labels\n",
    "#H Compute the loss\n",
    "#I Backpropagate\n",
    "#J Do not compute gradients in this block\n",
    "#K Gradient descent over the parameter matrices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:deeprl]",
   "language": "python",
   "name": "conda-env-deeprl-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
